package com.sunni.反射;

import com.sunni.反射.entity.Person;

import java.lang.reflect.Field;

public class _02_Field成员变量类 {
/*            - 获取++public权限++修饰的成员变量
            * Field[] getFields()   -- 获取全部变量
            * Field getField(String name)   -- 获取指定变量

            - 获取<u>所有权限</u>修饰的成员变量
            * Field[] getDeclaredFields()
            * Field getDeclaredField(String name)
* */

    public static void main(String[] args) throws Exception {

        // 0.拿到.class类
        Class personClass = Person.class;

        // 1. Field[] getFields(): 获得 '所有的public权限' 的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("=============");

        // 2.Field getField(String name): 获得 '指定的public权限' 的成员变量
            // 如果取到的成员变量，不是public权限的，报NoSuchFieldException:成员变量 没此类字段异常。
        Field a = personClass.getField("a");

            // 成员变量类的作用：
                //      1. Object get(); 获取 实例化对象 对应 成员变量的值
                //      2. void set(); 设置 实例化对象 对应 成员变量的值
        Person person02 = new Person();
        // get
        Object person02A = a.get(person02);
        System.out.println(person02A);
        // set
        a.set(person02,555);
        System.out.println(person02.getA());
        System.out.println("=============");

        // 3. Field[] getDeclaredFields()：获得 '所有的所有权限' 的成员变量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("declaredField = " + declaredField);
        }
        System.out.println("=============");

        // 4. Field getDeclaredField(String name)：获得 '指定的所有权限' 的成员变量
        Field d1 = personClass.getDeclaredField("d");

        // 报错：AccessibleObject.checkAccess安全检查。
            // 忽略它，暴力破解
        d1.setAccessible(true);
        Object d1o = d1.get(person02);
        System.out.println("d1o = " + d1o);

    }

}
